class Person {
  /**
   * TS 可以在属性前添加属性的修饰符
   * public 公有属性，可以在任何地方被访问（修改） 默认值
   * private 私有属性，只能在类的内部被访问（修改）
   *  - 通过在类中添加方法使得私有属性可以被外部外部访问
   * protected 受保护属性，可以在类的内部和子类中被访问（修改）
   */
  private _name: string;
  private _age: number;
  constructor(name: string, age: number) {
    this._name = name;
    this._age = age;
  }
  //   // 定义方法: 用来获取name属性
  //   getName(): string {
  //     return this._name;
  //   }
  //   // 定义方法: 用来设置name属性
  //   setName(name: string): void {
  //     this._name = name;
  //   }
  //   // 定义方法: 用来获取age属性
  //   getAge(): number {
  //     return this._age;
  //   }
  //   // 定义方法: 用来设置age属性
  //   setAge(age: number): void {
  //     if (age > 0) {
  //       this._age = age;
  //     }
  //   }

  // 设置getter方法
  get name(): string {
    // console.log("getter name执行了");
    return this._name;
  }
  // 设置setter方法
  set name(name: string) {
    // console.log("setter name执行了");
    this._name = name;
  }
  get age(): number {
    return this._age;
  }
  set age(value: number) {
    if (value >= 0) {
      this._age = value;
    }
  }
}

const person = new Person("小明", 38);
console.log(person);
// person.setName("小红");
// person.setAge(100);
// console.log(person);
console.log(person.name);
person.name = "小红";
console.log(person.name);

/**
 * 现在属性是在对象中设置的，属性可以任意被修改
 * 属性可以任意被修改会导致对象中的数据变的非常不安全
 */
// person._name = "小红";
// person.age = -12;
// console.log(person);

class A {
  protected num: number;
  constructor(num: number) {
    this.num = num;
  }
}

class B extends A {
  test() {
    console.log(this.num);
  }
}
const b = new B(1);
b.test();
// console.log(b.num);

// 简化写法
class C {
  // 可以直接将属性定义在构造函数中
  constructor(public name: string, public age: number) {}
}
